package com.qsw.httpnetlib.net.core;

import com.qsw.httpnetlib.net.core.callback.OnNetCallback;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import okhttp3.MediaType;
import okhttp3.MultipartBody;

/**
 * 基本网络操作中间层
 */
class NetManager {

    private NetCore mNetCore;

    NetManager() {
        mNetCore = NetCore.getInstance();
    }

    /**
     * 异步Put请求
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void putAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, null, null, null, params, onNetCallback, false);
    }

    /**
     * 异步Put请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void putAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, null, null, headers, params, onNetCallback, false);
    }

    /**
     * 异步Put请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                   Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, pathSegments, queryParameter, headers, params, onNetCallback, false);
    }

    /**
     * 异步Put请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    void putAsynch(String url, Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, null, null, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Put请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                   Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, pathSegments, queryParameter, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Put请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    void putAsynch(String url, Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, null, null, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Put请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                   Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(false, url, pathSegments, queryParameter, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void putRequestJsonAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, null, null, null, params, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void putRequestJsonAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, null, null, headers, params, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void putRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                              Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, pathSegments, queryParameter, headers, params, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    void putRequestJsonAsynch(String url, String json, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, null, null, null, json, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    void putRequestJsonAsynch(String url, Map<String, String> headers, String json, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, null, null, headers, json, onNetCallback, false);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param json           请求json字符串
     * @param onNetCallback  网络事件回调
     */
    void putRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                              Map<String, String> headers, String json, OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(false, url, pathSegments, queryParameter, headers, json, onNetCallback, false);
    }

    /**
     * 异步Post请求
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void postAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, null, null, null, params, onNetCallback, false);
    }

    /**
     * 异步Post请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void postAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, null, null, headers, params, onNetCallback, false);
    }

    /**
     * 异步Post请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                    Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, pathSegments, queryParameter, headers, params, onNetCallback, false);
    }

    /**
     * 异步Post请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    void postAsynch(String url, Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, null, null, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Post请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                    Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, pathSegments, queryParameter, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Post请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    void postAsynch(String url, Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, null, null, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Post请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                    Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, pathSegments, queryParameter, headers, contentType, content, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void postRequestJsonAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, null, null, null, params, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void postRequestJsonAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, null, null, headers, params, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void postRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                               Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, pathSegments, queryParameter, headers, params, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    void postRequestJsonAsynch(String url, String json, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, null, null, null, json, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    void postRequestJsonAsynch(String url, Map<String, String> headers, String json, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, null, null, headers, json, onNetCallback, false);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param json           请求json字符串
     * @param onNetCallback  网络事件回调
     */
    void postRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                               Map<String, String> headers, String json, OnNetCallback onNetCallback) {
        mNetCore.postOrPutRequestJsonAsynch(true, url, pathSegments, queryParameter, headers, json, onNetCallback, false);
    }

    /**
     * 文件下载，Post方式
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void downloadFile(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, null, null, headers, params, onNetCallback, true);
    }

    /**
     * 文件下载，Post方式
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void downloadFile(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                      Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetCore.postOrPutAsynch(true, url, pathSegments, queryParameter, headers, params, onNetCallback, true);
    }

    /**
     * 文件下载，Get方式
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    void downloadFile(String url, Map<String, String> headers, final OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(true, url, null, null, headers, onNetCallback, true);
    }

    /**
     * 文件下载，Get方式
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    void downloadFile(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                      Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(true, url, pathSegments, queryParameter, headers, onNetCallback, true);
    }

    /**
     * 图片上传
     *
     * @param url            请求地址
     * @param uploadImageKey 上传图片时该文件对应的参数Key
     * @param imageFileName  要上传的图片文件名
     * @param imageData      要上传的图片字节数据
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void uploadImage(String url, String uploadImageKey, String imageFileName, byte[] imageData, Map<String, String> headers,
                     Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.uploadImage(url, uploadImageKey, imageFileName, imageData, null, null, headers, params, onNetCallback);
    }

    /**
     * 图片上传
     *
     * @param url            请求地址
     * @param uploadImageKey 上传图片时该文件对应的参数Key
     * @param imageFileName  要上传的图片文件名
     * @param imageData      要上传的图片字节数据
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    void uploadImage(String url, String uploadImageKey, String imageFileName, byte[] imageData, final List<String> pathSegments, final Map<String, String> queryParameter,
                     Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.uploadImage(url, uploadImageKey, imageFileName, imageData, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 文件上传
     *
     * @param url           请求地址
     * @param uploadFileKey 上传文件时该文件对应的参数Key
     * @param uploadFile    要上传的文件
     * @param fileMIME      要上传的文件类型
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    void uploadFile(String url, String uploadFileKey, File uploadFile, String fileMIME, Map<String, String> headers,
                    Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetCore.uploadFile(url, uploadFileKey, uploadFile, fileMIME, null, null, headers, params, onNetCallback);
    }

    /**
     * 异步Get请求
     *
     * @param url           请求地址
     * @param onNetCallback 网络事件回调
     */
    void getAsynch(String url, final OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(true, url, null, null, null, onNetCallback, false);
    }

    /**
     * 异步Get请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    void getAsynch(String url, Map<String, String> headers, final OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(true, url, null, null, headers, onNetCallback, false);
    }

    /**
     * 异步Get请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    void getAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                   Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(true, url, pathSegments, queryParameter, headers, onNetCallback, false);
    }

    /**
     * 同步Get请求
     *
     * @param url 请求地址
     * @return 返回数据
     * @throws IOException 网络访问异常
     */
    String getSynch(String url) throws IOException {
        return mNetCore.getOrDeleteSynch(true, url, null, null, null);
    }

    /**
     * 同步Get请求
     *
     * @param url     请求地址
     * @param headers 请求头
     * @return 返回数据
     * @throws IOException 网络访问异常
     */
    String getSynch(String url, Map<String, String> headers) throws IOException {
        return mNetCore.getOrDeleteSynch(true, url, null, null, headers);
    }

    /**
     * 同步Get请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @throws IOException 网络访问异常
     */
    String getSynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                    Map<String, String> headers) throws IOException {
        return mNetCore.getOrDeleteSynch(true, url, pathSegments, queryParameter, headers);
    }

    /**
     * 异步Delete请求
     *
     * @param url           请求地址
     * @param onNetCallback 网络事件回调
     */
    void deleteAsynch(String url, OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(false, url, null, null, null, onNetCallback, false);
    }

    /**
     * 异步Delete请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    void deleteAsynch(String url, Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(false, url, null, null, headers, onNetCallback, false);
    }

    /**
     * 异步Delete请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    void deleteAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                      Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetCore.getOrDeleteAsynch(false, url, pathSegments, queryParameter, headers, onNetCallback, false);
    }

    /**
     * 同步Delete请求
     *
     * @param url 请求地址
     * @throws IOException 网络访问异常
     */
    String deleteSynch(String url) throws IOException {
        return mNetCore.getOrDeleteSynch(false, url, null, null, null);
    }

    /**
     * 同步Delete请求
     *
     * @param url     请求地址
     * @param headers 请求头
     * @throws IOException 网络访问异常
     */
    String deleteSynch(String url, Map<String, String> headers) throws IOException {
        return mNetCore.getOrDeleteSynch(false, url, null, null, headers);
    }

    /**
     * 同步Delete请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @throws IOException 网络访问异常
     */
    String deleteSynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                       Map<String, String> headers) throws IOException {
        return mNetCore.getOrDeleteSynch(false, url, pathSegments, queryParameter, headers);
    }
}
